1 module hip.gui.group; 2 import hip.gui.widget; 3 4 /** 5 * Defines a non rendering widget which is solely used for positioning purposes 6 */ 7 class Group : Widget 8 { 9 protected Widget[] renderFlatTree; 10 11 /** 12 * If you don't have overlapping sprites, you may flatten the tree for rendering. 13 * This beyond increasing iteration speed since there will be less recursive calls, 14 * it is also possible to sort by batch types. 15 */ 16 void flattenRenderTree(scope TypeInfo[] renderOrder...) 17 { 18 import core.memory; 19 if(renderFlatTree !is null) 20 GC.free(renderFlatTree.ptr); 21 Widget[] flattened; 22 static void flattenImpl(ref Widget[] arr, Widget w) 23 { 24 foreach(c; w.children) 25 flattenImpl(arr, c); 26 arr~= w; 27 } 28 flattenImpl(flattened, this); 29 30 import hip.util.algorithm; 31 import hip.util.array:array; 32 33 34 renderFlatTree = quicksort(flattened, (Widget a, Widget b) @nogc 35 { 36 TypeInfo aI = typeid(a), bI = typeid(b); 37 foreach(v; renderOrder) 38 { 39 if(bI is v) 40 return true; 41 if(aI is v) 42 return false; 43 } 44 return true; 45 }); 46 } 47 48 override void onRender(){} 49 50 override final void render() 51 { 52 if(renderFlatTree !is null) 53 { 54 preRender(); 55 foreach(ch; renderFlatTree) 56 { 57 if(ch.visible) 58 { 59 ch.preRender(); 60 ch.onRender(); 61 } 62 } 63 } 64 else 65 super.render(); 66 } 67 }